package com.monkeyboy.util;

import com.monkeyboy.common.Constants;
import com.monkeyboy.common.GenConstants;
import com.monkeyboy.model.GenTable;
import com.monkeyboy.model.GenTableColumn;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;

public class VelocityUtils {
    /**
     * 项目空间路径
     */
    private static final String PROJECT_PATH = "main/java";

    /**
     * mybatis空间路径
     */
    private static final String MYBATIS_PATH = "main/resources/mybatis";

    /**
     * 初始化vm方法
     */
    public static void initVelocity() {
        Properties p = new Properties();
        try {
            // 加载classpath目录下的vm文件
            p.setProperty("file.resource.loader.class" , "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
            // 定义字符集
            p.setProperty(Velocity.ENCODING_DEFAULT, Constants.UTF8);
            p.setProperty(Velocity.OUTPUT_ENCODING, Constants.UTF8);
            // 初始化Velocity引擎，指定配置Properties,
            Velocity.init(p);//单例模式初始化Velocity对象，其它地方直接使用Velocity.方法调用就行了
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 设置模板变量信息
     *
     * @return 模板列表
     */
    public static VelocityContext prepareContext(GenTable genTable) {
        VelocityContext velocityContext = new VelocityContext();
        velocityContext.put("tableComment" , genTable.getTableComment());
        velocityContext.put("tableName" , genTable.getTableName());
        velocityContext.put("functionName" , StringUtils.isNotEmpty(genTable.getFunctionName()) ? genTable.getFunctionName() : "【请填写功能名称】");
        velocityContext.put("ClassName" , genTable.getClassName());
        velocityContext.put("className" , StringUtils.uncapitalize(genTable.getClassName()));
        velocityContext.put("moduleName" , genTable.getModuleName());
        velocityContext.put("BusinessName" , StringUtils.capitalize(genTable.getBusinessName()));
        velocityContext.put("businessName" , genTable.getBusinessName());
        velocityContext.put("basePackage" , getPackagePrefix(genTable.getPackageName()));
        velocityContext.put("packageName" , genTable.getPackageName());
        velocityContext.put("datetime" , DateUtils.getTime());
        velocityContext.put("pkColumn" , genTable.getPkColumn());
        //根据java类型导入相应的包
        velocityContext.put("importList" , getImportList(genTable.getColumns()));
        velocityContext.put("columns" , genTable.getColumns());
        velocityContext.put("author" , genTable.getAuthor());
        velocityContext.put("table" , genTable);
        return velocityContext;
    }

    /**
     * 获取模板信息
     *
     * @return 模板列表
     */
    public static List<String> getTemplateList() {
        List<String> templates = new ArrayList<String>();
        templates.add("vm/index.html.vm");
        templates.add("vm/controller.java.vm");
        templates.add("vm/service.java.vm");
        templates.add("vm/mapper.xml.vm");
//        templates.add("vm/test.html.vm");
        return templates;
    }

    /**
     * 获取文件名
     */
    public static String getFileName(String template, GenTable genTable) {
        // 文件名称
        String fileName = "";
        // 包路径
        String packageName = genTable.getPackageName();
        // 模块名
        String moduleName = genTable.getModuleName();
        // 大写类名
        String className = genTable.getClassName();
        // 业务名称
        String businessName = genTable.getBusinessName();

        String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, "." , "/");
        String mybatisPath = MYBATIS_PATH + "/" + moduleName;

        if (template.contains("index.html.vm")) {
            fileName = StringUtils.format("{}_index.html" , businessName);
        } else if (template.contains("test.html.vm")) {
            fileName = StringUtils.format("test.html");
        } else if (template.contains("controller.java.vm")) {
            fileName = StringUtils.format("{}Controller.java" , className);
        } else if (template.contains("service.java.vm")) {
            fileName = StringUtils.format("{}Service.java" , className);
        } else if (template.contains("vm/mapper.xml.vm")) {
            fileName = StringUtils.format("{}Mapper.java" , className);
        }
        return fileName;
    }

    /**
     * 获取包前缀
     *
     * @param packageName 包名称
     * @return 包前缀名称
     */
    public static String getPackagePrefix(String packageName) {
        int lastIndex = packageName.lastIndexOf(".");
        String basePackage = StringUtils.substring(packageName, 0, lastIndex);
        return basePackage;
    }

    /**
     * 根据列类型获取导入包
     *
     * @param column 列集合
     * @return 返回需要导入的包列表
     */
    public static HashSet<String> getImportList(List<GenTableColumn> columns) {
        HashSet<String> importList = new HashSet<String>();
        for (GenTableColumn column : columns) {
            if (column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) {
                importList.add("java.util.Date");
                importList.add("com.fasterxml.jackson.annotation.JsonFormat");
            } else if (column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) {
                importList.add("java.math.BigDecimal");
            }
        }
        return importList;
    }
}